package main

import "fmt"

// defer
func f1() int {
	x := 5
	defer func() {
		x++
	}()
	return x
}
func f2() (x int) {
	defer func() {
		x++
	}()
	return 5
}
func f3() (y int) {
	x := 5
	defer func() {
		x++
	}()
	return x
}

func f4() (x int) {
	defer func(x int) {
		x++ // 改变的是函数中x的副本
	}(x)
	return 5
}
func f5() (x int) {
	defer func(x int) int {
		x++
		fmt.Println(x)
		return x
	}(x)
	return 5
}

// 传入一个x的指针到匿名函数中
func f6() (x int) {
	defer func(x *int) int {
		*x++
		// 直接修改了x在内存地址上的值的值 ++ = 6
		return *x
	}(&x)
	return 5
	// 1. 返回值 =x=5
	// 2. defer x = 6
	// 3. RET返回
	/*
		先返回值赋值  然后执行defer
		返回值 5 赋值给x
		然后x指针传给函数  把此地址的值
		执行++ 操作 x = 5 ++   == 6
	*/
}

func main() {
	// f1()
	fmt.Println(f1())
	fmt.Println(f2())
	fmt.Println(f3())
	fmt.Println(f4())
	fmt.Println(f5())
	fmt.Println(f6())
}
